<html>
  <head></head>
  <body>
    <p>数组去重</p>

    <script>
      // 双循环去重
      // 时间复杂度 O(n²) 双重循环
      // 空间复杂度 O(n) 需要一个额外的Array存储空间
      function uniqueArr_1(arr) {
        const newArr = []
        arr.forEach(item => {
          if (!newArr.includes(item)) newArr.push(item)
        })
        return newArr
      }

      // 利用对象去重
      // 时间复杂度 O(n) Object[key]是采用hash查找，时间复杂度为O(1)
      // 空间复杂度 O(n) 需要一个额外的set和Array的存储空间
      function uniqueArr_2(arr) {
        const newArr = []
        const obj = {}
        arr.forEach((item, index) => {
          if (!obj.hasOwnProperty(item)) {
            newArr.push(item)
            obj[item] = ''
          }
        })
        return newArr
      }

      // ES6 set方法
      // 时间复杂度 O(n)
      // 空间复杂度 O(n) 需要一个额外的Set存储空间和Array的存储空间
      function uniqueArr_3(arr) {
        const set = new Set(arr)
        return Array.from(set)
      }

      var arr = [1, 2, 2, 3, 3, 4, 5]
      var newArr = uniqueArr_2(arr)
      console.log(newArr)
    </script>
  </body>
</html>
